#ifndef TTS_H
#define TTS_H
#include "Arduino.h"
#include "UTF8ToGB2312.h"
#include <SoftwareSerial.h>
#include <Wire.h>
#include <U8g2lib.h>

// 根据你的屏幕尺寸选择合适的定义，这里以128x64为例
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

// 创建U8g2对象，使用I2C通信方式
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
EspSoftwareSerial::UART myPort;
const int line_height = 15;       // 每行的高度
const int max_chars_per_line = 8; // 每行最多显示的字符数
char GPT_change = 'D'; // M是Minimax，D是Doubao，B是baidu
void scrollText(const char *text)
{
    static int update = 0;
    if (update == 0)
        u8g2.clearBuffer();
    // 判断text首字符是否为QAID，如果是，则只显示A:行
    if (text[0] == 'Q')
    {
        // 如果text长度大于10，则滚动显示
        if (strlen(text) > 9)
        {
            // 滚动显示
            for (int i = 0; i < strlen(text) - 9; i++)
            {
                // 等待一段时间，以使屏幕滚动
                delay(500);
                // 显示滚动后的文本
                u8g2.setCursor(0, line_height);
                u8g2.print(text);
                u8g2.sendBuffer(); // 将缓冲区内容发送到屏幕
            }
        }
        else
        {
            // 直接显示
            u8g2.setCursor(0, line_height);
            u8g2.print(text);
            u8g2.sendBuffer(); // 将缓冲区内容发送到屏幕
        }
    }
    else if (text[0] == 'A')
    {

        // 如果text长度大于10，则滚动显示
        if (strlen(text) > 9)
        {
            // 滚动显示
            for (int i = 0; i < strlen(text) - 9; i++)
            {
                // 等待一段时间，以使屏幕滚动
                delay(500);
                // 显示滚动后的文本
                u8g2.setCursor(0, 2 * line_height);
                u8g2.print(text);
                u8g2.sendBuffer(); // 将缓冲区内容发送到屏幕
            }
        }
        else
        {
            // 直接显示
            u8g2.setCursor(0, 2 * line_height);
            u8g2.print(text);
            u8g2.sendBuffer(); // 将缓冲区内容发送到屏幕
        }
    }
    else if (text[0] == 'I')
    {
        // 如果text长度大于10，则滚动显示
        if (strlen(text) > 9)
        {
            // 滚动显示
            for (int i = 0; i < strlen(text) - 9; i++)
            {
                // 等待一段时间，以使屏幕滚动
                delay(500);
                // 显示滚动后的文本
                u8g2.setCursor(0, 3 * line_height);
                u8g2.print(text);
                u8g2.sendBuffer(); // 将缓冲区内容发送到屏幕
            }
        }
        else
        {
            // 直接显示
            u8g2.setCursor(0, 3 * line_height);
            u8g2.print(text);
            u8g2.sendBuffer(); // 将缓冲区内容发送到屏幕
        }
    }
    // 直接显示
    u8g2.setCursor(0, 4 * line_height);
    u8g2.print("N: ");
    u8g2.print(update++);
    u8g2.print("   M : ");
    u8g2.print(GPT_change);
    u8g2.sendBuffer(); // 将缓冲区内容发送到屏幕
}

void speech(String data)
{
    // 0--空闲  1--繁忙  2--异常
    String utf8_str = data;
    String gb2312_str = GB.get(utf8_str);
    unsigned char head[gb2312_str.length() + 6];
    // 定义无符号字符类型数组，将 GB2312 编码的字符串复制到数组中
    unsigned char gb2312_data[gb2312_str.length() + 1];
    memset(gb2312_data, 0, sizeof(gb2312_data));
    strncpy((char *)gb2312_data, gb2312_str.c_str(), gb2312_str.length());
    // head byte
    head[0] = 0xFD;
    // length bytes
    unsigned int dat_len = gb2312_str.length() + 3;
    head[1] = dat_len >> 8;
    head[2] = dat_len;
    // cmd byte
    head[3] = 0x01;
    // para byte
    head[4] = 0x01;
    // send each character individually
    for (int i = 0; i < gb2312_str.length(); i++)
    {
        head[i + 5] = gb2312_data[i];
    }
    // 计算异或值并添加到数组，额这个是syn那个芯片的例程，这个异或计算有没有用我懒得改了。反正代码能跑。
    head[gb2312_str.length() + 5] = head[0];
    for (int i = 1; i < gb2312_str.length() + 5; i++)
    {
        head[gb2312_str.length() + 5] ^= head[i];
    }
    // 发送字符数组到串口
    for (int j = 0; j < gb2312_str.length() + 6; j++)
    {
        myPort.write(head[j]);
    }
    delay(gb2312_str.length() * 130);
    // Serial.println(data);
}
// 查询tts合成工作状态 返回1表示繁忙 0表示空闲
int workstate(void)
{
    unsigned char head[4] = {0xFD, 0x00, 0x01, 0x21};
    // 发送字符数组到串口
    for (int j = 0; j < 4; j++)
    {
        myPort.write(head[j]);
    }

    // 等待myPort的返回
    while (myPort.available() < 1)
    {
        // 可以在这里加入一些延时，以防止过快地查询
        delay(150);
    }

    // 读取并处理返回的数据
    byte response = myPort.read();

    // 返回相应的状态值
    if (response == 0x4E)
    {
        // 繁忙
        return 1;
    }
    else if (response == 0x4F)
    {
        // 空闲
        return 0;
    }
    else
    {
        // 未知状态，可以根据需要进行处理
        return 2;
    }
}

void word_cut(String answer)
{
    // 切片句子输出，检测到。！？；：符号切割句子
    int index = 0;
    int len = answer.length();
    for (int i = 0; i < len; i++)
    {
        if (answer[i] == '，' || answer[i] == '。' || answer[i] == '？' || answer[i] == '！' || answer[i] == '：')
        {
            speech(answer.substring(index, i + 1));
            index = i + 1;
        }
    }
    if (index < len)
    {
        speech(answer.substring(index, len));
    }
}
#endif // TTS_H
